<markup>
<div class="init-loading"><div class = "loader"></div></div>

<section data-view-id="page1" data-view="true">
	<header>视图</header>
	<div class = "body">
		<h1>视图就绪</h1>
	</div>
</section>
</markup>
<link rel = "stylesheet" href = "demo/css/common.css"/>
<style>
@keyframes before {
	0% {
		width: 0.5em;
		box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75);
	}
	35% {
		width: 2.5em;
		box-shadow: 0 -0.5em rgba(225, 20, 98, 0.75), 0 0.5em rgba(111, 202, 220, 0.75);
	}
	70% {
		width: 0.5em;
		box-shadow: -1em -0.5em rgba(225, 20, 98, 0.75), 1em 0.5em rgba(111, 202, 220, 0.75);
	}
	100% {
		box-shadow: 1em -0.5em rgba(225, 20, 98, 0.75), -1em 0.5em rgba(111, 202, 220, 0.75);
	}
}
@keyframes after {
	0% {
		height: 0.5em;
		box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75);
	}
	35% {
		height: 2.5em;
		box-shadow: 0.5em 0 rgba(61, 184, 143, 0.75), -0.5em 0 rgba(233, 169, 32, 0.75);
	}
	70% {
		height: 0.5em;
		box-shadow: 0.5em -1em rgba(61, 184, 143, 0.75), -0.5em 1em rgba(233, 169, 32, 0.75);
	}
	100% {
		box-shadow: 0.5em 1em rgba(61, 184, 143, 0.75), -0.5em -1em rgba(233, 169, 32, 0.75);
	}
}
.loader {
	position: absolute;
	top: calc(50% - 1.25em);
	left: calc(50% - 1.25em);
	width: 2.5em;
	height: 2.5em;
	transform: rotate(165deg);
}
.loader:before, .loader:after {
	content: '';
	position: absolute;
	top: 50%;
	left: 50%;
	display: block;
	width: 0.5em;
	height: 0.5em;
	border-radius: 0.25em;
	transform: translate(-50%, -50%);
}
.loader:before {
	animation: before 2s infinite;
}
.loader:after {
	animation: after 2s infinite;
}

.init-loading{
	position: fixed;
	left: 0;
	top: 0;
	width: 100%;
	height: 100%;
	z-index: 99999;
	background: #eee;
}
.init-loading.hide {
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.5s;
}
</style>
<script>
var initLoadingObj = document.querySelector(".init-loading");

/**
 * 加载并应用配置
 * @param {Function} callback 操作完成后要执行的回调方法
 */
var loadAndApplyConfig = function(callback){
	/* 使用定时器模拟操作过程及网络耗时 */
	setTimeout(function(){
		callback();
	}, 1000);
};

/**
 * 执行token登录
 * @param {Function} callback 操作完成后要执行的回调方法
 */
var loginByToken = function(callback){
	/* 使用定时器模拟操作过程及网络耗时 */
	setTimeout(function(){
		callback();
	}, 1000);
};

/**
 * 加载用户数据
 * @param {Function} callback 操作完成后要执行的回调方法
 */
var loadUserData = function(callback){
	/* 使用定时器模拟操作过程及网络耗时 */
	setTimeout(function(){
		callback();
	}, 1000);
};

/**
 * 通过设置初始化器，应用可以根据需要灵活决定View的初始化时机，例如：
 * 1. 读取并应用陪之后
 * 2. token登录之后
 */
View.setInitializer(
	function(init){
		loadAndApplyConfig(function(){
			loginByToken(function(){
				loadUserData(function(){
					util.addClass(initLoadingObj, "hide");
					setTimeout(function(){
						initLoadingObj.style.display = "none";
					}, 200);

					init();
				});
			});
		});
	},
	"rightnow"/* 初始化器的自动执行时机。domready：DOM就绪后执行；rightnow：立即执行。默认为：domready */
);
</script>
<script class = "ctrl">
	{
		/* 是否声明自己的 initializer */
		ifSpecifyViewjsInitializer: true
	}
</script>